package com.lovi.notepaper.activities;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import android.Manifest;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.GradientDrawable;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.util.Patterns;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.lovi.notepaper.R;
import com.lovi.notepaper.database.NoteDatabase;
import com.lovi.notepaper.entities.Note;
import com.google.android.material.bottomsheet.BottomSheetBehavior;

import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class CreateNoteActivity extends AppCompatActivity {

    // 便笺标题、副标题、正文、时间、图片、网址等视图控件
    private EditText inputNoteTitle, inputNoteSubtitle, inputNoteText;
    private TextView textDateTime;
    private ImageView imageNote;



    private TextView textWebURL;
    private LinearLayout layoutWebURL;

    // 副标题颜色标记视图
    private View viewSubtitleIndicator;

    // 选中的便笺颜色
    private String selectedNoteColor;
    // 选中的图片路径
    private String selectedImagePath;

    // 添加网址对话框和删除便笺对话框
    private AlertDialog dialogAddURL;
    private AlertDialog dialogDeleteNote;

    // 权限请求码和选择图片请求码
    private static final int REQUEST_CODE_STORAGE_PERMISSION = 1;
    private static final int REQUEST_CODE_SELECT_IMAGE = 2;


    //当前被查看对象
    private Note alreadyAvailableNote;

    // 定义颜色数组
    int[] colors = {Color.WHITE, Color.parseColor("#292929")};
    int currentColorIndex = 0;  // 当前颜色的索引


    /**
     * 查找并获取便笺标题、副标题、正文、时间、图片、网址等视图控件。
     * 设置时间显示。
     * 设置保存按钮的点击事件。
     * 设置默认便笺颜色和副标题颜色标记视图。
     * 如果是查看或编辑已有便笺，则获取已有便笺对象并设置视图控件的值。
     * 初始化删除网址和图片按钮的点击事件。
     * 如果是从快速操作进入，则根据选中的类型显示相应的图片或网址。
     * 初始化底部弹窗。
     * 设置副标题标记的颜色。
     * @param savedInstanceState If the activity is being re-initialized after
     *     previously being shut down then this Bundle contains the data it most
     *     recently supplied in {@link #onSaveInstanceState}.  <b><i>Note: Otherwise it is null.</i></b>
     *
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_create_note);

        // 返回按钮
        ImageView imageBack = findViewById(R.id.imageBack);
        imageBack.setOnClickListener(view -> onBackPressed());

        // 获取便笺标题、副标题、正文、时间、图片、网址等视图控件
        inputNoteTitle = findViewById(R.id.inputNoteTitle);
        inputNoteSubtitle = findViewById(R.id.inputNoteSubtitle);
        inputNoteText = findViewById(R.id.inputNoteText);
        textDateTime = findViewById(R.id.textDateTime);
        imageNote = findViewById(R.id.imageNote);
        textWebURL = findViewById(R.id.textWebURL);
        layoutWebURL = findViewById(R.id.layoutWebURL);

        // 设置时间显示
        textDateTime.setText(
                new SimpleDateFormat("EEEE, dd MMMM yyyy HH:mm a", Locale.getDefault()).format(new Date())
        );

        // 保存按钮（这里我们联系了保存到数据库的操作）
        ImageView imageDone = findViewById(R.id.imageSave);
        imageDone.setOnClickListener(v -> saveNote());

        // 默认便笺颜色
        selectedNoteColor = "#333333";//就是一个sting值
        viewSubtitleIndicator = findViewById(R.id.viewSubtitleIndicator);
        selectedImagePath = "";

        // 设置当前要查看的便笺
        if(getIntent().getBooleanExtra("isViewOrUpdate",false)){
            alreadyAvailableNote = (Note)getIntent().getSerializableExtra("note");
            setViewOrUpdateNote();
        }

        // 初始化删除网址和图片按钮
        findViewById(R.id.imageRemoveWebURL).setOnClickListener(v -> {
            textWebURL.setText(null);
            layoutWebURL.setVisibility(View.GONE);
        });

        findViewById(R.id.imageRemoveImage).setOnClickListener(v -> {
            imageNote.setImageBitmap(null);
            imageNote.setVisibility(View.GONE);
            findViewById(R.id.imageRemoveImage).setVisibility(View.GONE);
            selectedImagePath = "";
        });

        // 从快速操作进入，快捷操作。
        if(getIntent().getBooleanExtra("isFromQuickActions",false)){
            String type = getIntent().getStringExtra("quickActionType");
            if(type != null){
                if(type.equals("image")){
                    // 显示选中的图片
                    selectedImagePath = getIntent().getStringExtra("imagePath");
                    imageNote.setImageBitmap(BitmapFactory.decodeFile(selectedImagePath));
                    imageNote.setVisibility(View.VISIBLE);
                    findViewById(R.id.imageRemoveImage).setVisibility(View.VISIBLE);
                }else if(type.equals("URL")){
                    // 显示选中的网址
                    textWebURL.setText(getIntent().getStringExtra("URL"));
                    layoutWebURL.setVisibility(View.VISIBLE);
                }
            }
        }

        // 初始化底部弹窗
        initMiscellaneous();
        // 设置副标题标签颜色
        setSubtitleIndicatorColor();


        // 绑定快捷按钮的点击事件
//        findViewById(R.id.imageAddNote).setOnClickListener(v -> {
//            startActivityForResult(new Intent(getApplicationContext(), CreateNoteActivity.class),1);
//        });
        findViewById(R.id.imageAddBackground).setOnClickListener(v -> {
//            startActivityForResult(new Intent(getApplicationContext(), CreateNoteActivity.class),1);
            // 获取活动界面根布局控件
            CoordinatorLayout mainLayout = findViewById(R.id.creatLayout);

            // 设置背景颜色
            mainLayout.setBackgroundColor(colors[currentColorIndex]);
            //判断，如果是黑夜模式
            if (colors[currentColorIndex] == Color.WHITE) {
                inputNoteTitle.setTextColor(Color.BLACK);
            } else {
                // 如果当前颜色不是白色，则不做任何处理
                inputNoteTitle.setTextColor(Color.WHITE);
            }
            // 更新当前颜色的索引
            currentColorIndex = (currentColorIndex + 1) % colors.length;

        });

        findViewById(R.id.imageAddImage).setOnClickListener(v -> {
            // 如果没有读取存储权限，就向系统请求权限
            if(ContextCompat.checkSelfPermission(getApplicationContext(),
                    Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
                ActivityCompat.requestPermissions(CreateNoteActivity.this,
                        new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},REQUEST_CODE_STORAGE_PERMISSION);
            }else{ // 否则，打开系统图库选择图片
                selectImage();
            }
        });

        findViewById(R.id.imageAddWebLink).setOnClickListener(v -> {
            // 显示添加 URL 的对话框
            showAddUrlDialog();
        });

    }


    /**
     * 设置或更新已有便笺的视图控件值
     *
     * 设置便笺正文、标题、副标题、时间的值。
     * 如果便笺有图片，则显示图片。
     * 如果便笺有网址，则显示网址。
     */
    private void setViewOrUpdateNote(){
        // 设置便笺正文、标题、副标题、时间的值
        inputNoteText.setText(alreadyAvailableNote.getNoteText());
        inputNoteTitle.setText(alreadyAvailableNote.getTitle());
        inputNoteSubtitle.setText(alreadyAvailableNote.getSubtitle());
        textDateTime.setText(alreadyAvailableNote.getDateTime());

        // 如果便笺有图片，则显示图片
        if(alreadyAvailableNote.getImagePath() != null && !alreadyAvailableNote.getImagePath().trim().isEmpty()){
            imageNote.setImageBitmap(BitmapFactory.decodeFile(alreadyAvailableNote.getImagePath()));
            imageNote.setVisibility(View.VISIBLE);
            findViewById(R.id.imageRemoveImage).setVisibility(View.VISIBLE);
            selectedImagePath = alreadyAvailableNote.getImagePath();
        }

        // 如果便笺有网址，则显示网址
        if(alreadyAvailableNote.getWebLink() != null && !alreadyAvailableNote.getWebLink().trim().isEmpty()){
            textWebURL.setText(alreadyAvailableNote.getWebLink());
            layoutWebURL.setVisibility(View.VISIBLE);
        }
    }


    /**
     * 保存便笺
     *
     * 检查便笺标题和内容是否为空，如果为空则提示用户。
     * 创建一个 Note 对象，并设置各个属性值。
     * 如果是更新已有便笺，则设置便笺的 ID。
     * 创建一个内部类 SaveNoteTask 用于异步保存便笺到数据库。
     * 实例化 SaveNoteTask 并执行。保存完成后发送一个结果码给上一个活动，隐藏软键盘并关闭当前活动。
     */
    private void saveNote(){
        // 如果标题为空，则提示用户标题不能为空
        if(inputNoteTitle.getText().toString().trim().isEmpty()){
            Toast.makeText(this,"笔记标题不能为空！",Toast.LENGTH_SHORT).show();
            return;
        }
        // 如果副标题和正文都为空，则提示用户便笺不能为空
        else if(inputNoteSubtitle.getText().toString().trim().isEmpty()
                && inputNoteText.getText().toString().trim().isEmpty()){
            Toast.makeText(this,"笔记内容不能为空！",Toast.LENGTH_SHORT).show();
            return;
        }

        final Note note = new Note();
        note.setTitle(inputNoteTitle.getText().toString());
        note.setSubtitle(inputNoteSubtitle.getText().toString());
        note.setNoteText(inputNoteText.getText().toString());
        note.setDateTime(textDateTime.getText().toString());
        note.setColor(selectedNoteColor);//给笔记设置颜色。(这个颜色不仅对应着笔记内部的副标题标记，还有外部的，
        note.setInColor(selectedNoteColor);//给笔记设置颜色。(这个颜色不仅对应着笔记内部的副标题标记，还有外部的，
        //note.setOutColor(selectedNoteColor);//给笔记设置颜色。(这个颜色不仅对应着笔记内部的副标题标记，还有外部的，
        note.setImagePath(selectedImagePath);

        if(layoutWebURL.getVisibility() == View.VISIBLE){
            note.setWebLink(textWebURL.getText().toString());
        }

        if(alreadyAvailableNote != null){
            note.setId(alreadyAvailableNote.getId());
        }

        // 内部类，用于异步保存便笺到数据库
        @SuppressLint("StaticFieldLeak")
        class SaveNoteTask extends AsyncTask<Void,Void,Void>{
            public SaveNoteTask(){
                super();
            }

            @Override
            protected Void doInBackground(Void... voids) {
                NoteDatabase.getNoteDatabase(getApplicationContext()).noteDao().insertNote(note);//数据库操作
                Log.d("My Notes",note.toString());
                return null;
            }

            @Override
            protected void onPostExecute(Void unused) {
                super.onPostExecute(unused);
                Intent intent = new Intent();
                setResult(RESULT_OK,intent);
                // 隐藏软键盘
                InputMethodManager imm = (InputMethodManager) CreateNoteActivity.this.getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(CreateNoteActivity.this.getWindow().getDecorView().getWindowToken(),0);
                finish();
            }
        }

        // 实例化异步类并执行
        new SaveNoteTask().execute();
    }


    private void initMiscellaneous(){
        final LinearLayout layoutMiscellaneous = findViewById(R.id.layoutMiscellaneous);
        final BottomSheetBehavior<LinearLayout> bottomSheetBehavior = BottomSheetBehavior.from(layoutMiscellaneous);

        // 点击底部栏标题展开或收起底部栏
        layoutMiscellaneous.findViewById(R.id.textMiscellaneous).setOnClickListener(v -> {
            if(bottomSheetBehavior.getState() != BottomSheetBehavior.STATE_EXPANDED){
                bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
            }else{
                bottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
            }
        });
        //这些都在杂项里边的。
        // 点击颜色选择器改变笔记颜色
        final ImageView item1 = layoutMiscellaneous.findViewById(R.id.imageColor1);
        final ImageView item2 = layoutMiscellaneous.findViewById(R.id.imageColor2);
        final ImageView item3 = layoutMiscellaneous.findViewById(R.id.imageColor3);
        final ImageView item4 = layoutMiscellaneous.findViewById(R.id.imageColor4);
        final ImageView item5 = layoutMiscellaneous.findViewById(R.id.imageColor5);

        layoutMiscellaneous.findViewById(R.id.viewColor1).setOnClickListener(v -> {
            selectedNoteColor = "#333333";
            item1.setImageResource(R.drawable.ic_done);
            item2.setImageResource(0);
            item3.setImageResource(0);
            item4.setImageResource(0);
            item5.setImageResource(0);
            //将子标题的颜色改为选定的颜色显示
            setSubtitleIndicatorColor();
        });

        layoutMiscellaneous.findViewById(R.id.viewColor2).setOnClickListener(v -> {
            selectedNoteColor = "#FDBE3B";
            item2.setImageResource(R.drawable.ic_done);
            item1.setImageResource(0);
            item3.setImageResource(0);
            item4.setImageResource(0);
            item5.setImageResource(0);
            setSubtitleIndicatorColor();
        });

        layoutMiscellaneous.findViewById(R.id.viewColor3).setOnClickListener(v -> {
            selectedNoteColor = "#FF4842";
            item3.setImageResource(R.drawable.ic_done);
            item2.setImageResource(0);
            item1.setImageResource(0);
            item4.setImageResource(0);
            item5.setImageResource(0);
            setSubtitleIndicatorColor();
        });

        layoutMiscellaneous.findViewById(R.id.viewColor4).setOnClickListener(v -> {
            selectedNoteColor = "#3A52FC";
            item4.setImageResource(R.drawable.ic_done);
            item1.setImageResource(0);
            item2.setImageResource(0);
            item3.setImageResource(0);
            item5.setImageResource(0);
            setSubtitleIndicatorColor();
        });
        layoutMiscellaneous.findViewById(R.id.viewColor5).setOnClickListener(v -> {
            selectedNoteColor = "#000000";
            item5.setImageResource(R.drawable.ic_done);
            item2.setImageResource(0);
            item1.setImageResource(0);
            item4.setImageResource(0);
            item3.setImageResource(0);
            setSubtitleIndicatorColor();
        });

        // 进入笔记时更新颜色
        //为了提高用户体验，让用户在编辑已有笔记时不必重新选择颜色，直接继承之前的颜色选择。
        if(alreadyAvailableNote != null && alreadyAvailableNote.getColor() != null && !alreadyAvailableNote.getColor().trim().isEmpty()){
            switch (alreadyAvailableNote.getColor()){
                case "#FDBE3B":
                    layoutMiscellaneous.findViewById(R.id.viewColor2).performClick();
                    break;
                case "#FF4842":
                    layoutMiscellaneous.findViewById(R.id.viewColor3).performClick();
                    break;
                case "#3A52FC":
                    layoutMiscellaneous.findViewById(R.id.viewColor4).performClick();
                    break;
                case "#000000":
                    layoutMiscellaneous.findViewById(R.id.viewColor5).performClick();
                    break;
            }
        }

        // 点击添加图片按钮
        layoutMiscellaneous.findViewById(R.id.layoutAddImage).setOnClickListener(v -> {
            // 收起底部栏
            bottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
            // 如果没有读取存储的权限，则请求权限
            if(ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
                ActivityCompat.requestPermissions(CreateNoteActivity.this,new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},REQUEST_CODE_STORAGE_PERMISSION);
            }else{
                selectImage();
            }
        });

        // 点击添加链接按钮
        layoutMiscellaneous.findViewById(R.id.layoutAddUrl).setOnClickListener(v -> {
            // 收起底部栏
            bottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
            showAddUrlDialog();
        });

        // 如果已经有笔记，则显示删除笔记按钮
        if(alreadyAvailableNote != null){
            layoutMiscellaneous.findViewById(R.id.layoutDeleteNote).setVisibility(View.VISIBLE);
            layoutMiscellaneous.findViewById(R.id.layoutDeleteNote).setOnClickListener(v -> {
                bottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
                showDeleteNoteDialog();
            });
        }
    }

    /**
     * 删除弹窗的操作！（包括删除数据库的数据）
     */
    private void showDeleteNoteDialog(){
        if(dialogDeleteNote == null){
            // 创建一个弹窗的上下文
            AlertDialog.Builder builder = new AlertDialog.Builder(CreateNoteActivity.this);
            // 获取弹窗内要显示的布局
            View view = LayoutInflater.from(CreateNoteActivity.this).inflate(
                    R.layout.layout_delete_note,
                    (ViewGroup)findViewById(R.id.layoutDeleteNoteContainer));
            builder.setView(view);
            dialogDeleteNote = builder.create();

            // 设置弹窗的背景颜色
            if(dialogDeleteNote.getWindow() != null){
                dialogDeleteNote.getWindow().setBackgroundDrawable(new ColorDrawable(0));
            }

            // 设置弹窗内的"删除"按钮的点击事件
            view.findViewById(R.id.textDeleteNote).setOnClickListener(v -> {
                class DeleteAsyncTask extends AsyncTask<Void,Void,Void>{
                    @Override
                    protected Void doInBackground(Void... voids) {
                        System.out.println(NoteDatabase.getNoteDatabase(getApplicationContext()).noteDao().getAllNotes());
                        // 删除已有笔记
                        NoteDatabase.getNoteDatabase(getApplicationContext()).noteDao()
                                .deleteNote(alreadyAvailableNote);//数据库操作罢了
                        System.out.println(NoteDatabase.getNoteDatabase(getApplicationContext()).noteDao().getAllNotes());
                        return null;
                    }

                    @Override
                    protected void onPostExecute(Void unused) {
                        super.onPostExecute(unused);
                        // 将已删除笔记的结果通过Intent返回给上一个界面
                        Intent intent = new Intent();
                        intent.putExtra("isNoteDeleted",true);
                        setResult(RESULT_OK,intent);
                        System.out.println(intent);
                        System.out.println(intent.getExtras().get("isNoteDeleted"));
                        // 结束当前Activity
                        finish();
                    }
                }

                new DeleteAsyncTask().execute();
            });

            // 设置弹窗内的"取消"按钮的点击事件
            view.findViewById(R.id.textCancel).setOnClickListener(v -> {
                dialogDeleteNote.dismiss();
            });
        }
        dialogDeleteNote.show();
    }



    /**
     * 从系统相册选择图片
     */
    private void selectImage() {
        Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        if(intent.resolveActivity(getPackageManager()) != null){
            startActivityForResult(intent,REQUEST_CODE_SELECT_IMAGE);
        }
    }

    /**
     * 请求权限的结果。如果还是失败的话，就吐司提示。
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        // 检查是否为存储权限请求码，且已经获取了权限
        if(requestCode == REQUEST_CODE_STORAGE_PERMISSION && grantResults.length > 0){
            // 选择图片
            selectImage();
        }else{
            // 如果没有获取权限则输出日志和提示信息
            Log.d("Permission check","没有同意权限");
            Toast.makeText(this,"Permission Denied",Toast.LENGTH_SHORT).show();
        }
    }

    /**
     重写onActivityResult方法，用于处理从相册中选择图片后的逻辑
     @param requestCode 请求码
     @param resultCode 结果码
     @param data 返回的数据
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // 如果选择了图片并且结果码为RESULT_OK
        if (requestCode == REQUEST_CODE_SELECT_IMAGE && resultCode == RESULT_OK) {
            // 如果返回的数据不为空
            if (data != null) {
                Uri selectedImageUri = data.getData();
            // 如果选择的图片uri不为空
                if (selectedImageUri != null) {
                    try {
                        InputStream inputStream = getContentResolver().openInputStream(selectedImageUri);
                        Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
                        imageNote.setImageBitmap(bitmap); // 将图片设置到imageNote控件上
                        imageNote.setVisibility(View.VISIBLE); // 显示imageNote控件
                    // 在拿到图片后立刻渲染删除按钮
                        findViewById(R.id.imageRemoveImage).setVisibility(View.VISIBLE);
                        selectedImagePath = getPathFromUri(selectedImageUri); // 从uri中获取图片路径
                    } catch (Exception e) {
                        e.printStackTrace();
                        Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show(); // 打印异常信息并弹出Toast提示
                    }
                }
            }
        }
    }


    /**
     * 获取从相册中选择的图片的路径。当我们从相册中选择一张图片后，系统会返回一个 Uri，但是我们需要获取这张图片的路径才能进行后续的操作。
     * @param contentUri
     * @return
     */
    private String getPathFromUri(Uri contentUri){
        String filePath;

        // 获取一个游标，用于查询指定 Uri 的数据
        Cursor cursor = getContentResolver().query(contentUri,null,null,null,null);

        if(cursor == null){
            // 如果游标为空，说明 Uri 对应的数据不在 MediaStore 中，直接使用 Uri 的路径
            filePath = contentUri.getPath();
        }else{
            // 如果游标不为空，说明 Uri 对应的数据在 MediaStore 中，通过游标查询出路径
            cursor.moveToFirst();
            int index = cursor.getColumnIndex("_data");
            filePath = cursor.getString(index);
            cursor.close();
        }

        return filePath;
    }

    /**
     * 设置副标题左边那个标记的颜色
     * 顺便设置一下背景颜色。
     */
    private void setSubtitleIndicatorColor(){
        //获取副标题标记视图的背景颜色（这个时候不一定是选定的颜色，第一行只是获取之前的颜色）
        GradientDrawable gradientDrawable = (GradientDrawable) viewSubtitleIndicator.getBackground();
        //这里才是真正的根据selectedNoteColor的颜色来修改子标题的标记的颜色。
        gradientDrawable.setColor(Color.parseColor(selectedNoteColor));//通过笔记选择的背景颜色来设置颜色。

        CoordinatorLayout coordinatorLayout = findViewById(R.id.creatLayout);
        // // 修改 CoordinatorLayout 的背景颜色
        coordinatorLayout.setBackgroundColor(Color.parseColor(selectedNoteColor));

    }

    /**
     * 显示添加URL对话框的方法
     */
    private void showAddUrlDialog(){
        if(dialogAddURL == null){
            // 创建AlertDialog.Builder对象，并设置对话框的布局文件和视图
            AlertDialog.Builder builder = new AlertDialog.Builder(CreateNoteActivity.this);
            View view = LayoutInflater.from(this).inflate(R.layout.layout_add_url,(ViewGroup)findViewById(R.id.layoutAddUrlContainer));

            // 将布局文件设置为AlertDialog的视图
            builder.setView(view);

            // 获取AlertDialog对象，如果窗口不为空则将其背景设为透明
            dialogAddURL = builder.create();
            if(dialogAddURL.getWindow() != null){
                dialogAddURL.getWindow().setBackgroundDrawable(new ColorDrawable(0));
            }

            // 获取EditText控件并设置焦点
            final EditText inputUrl = view.findViewById(R.id.inputURL);
            inputUrl.requestFocus();

            // 点击“添加”按钮的监听器，判断输入的网址是否为空或不合法，如果都不满足则弹出对话框，否则将输入的网址保存到textWebURL控件中并隐藏布局文件和对话框
            view.findViewById(R.id.textAdd).setOnClickListener(v -> {
                if(inputUrl.getText().toString().trim().isEmpty()){
                    Toast.makeText(CreateNoteActivity.this,"请输入URL",Toast.LENGTH_SHORT).show();
                }else if(!Patterns.WEB_URL.matcher(inputUrl.getText().toString()).matches()){
                    Toast.makeText(CreateNoteActivity.this,"请输入有效的URL！",Toast.LENGTH_SHORT).show();
                }else{
                    textWebURL.setText(inputUrl.getText().toString());
                    layoutWebURL.setVisibility(View.VISIBLE);
                    dialogAddURL.dismiss();
                }
            });

            // 点击“取消”按钮的监听器，隐藏对话框
            view.findViewById(R.id.textCancel).setOnClickListener(v -> {
                dialogAddURL.dismiss();
            });
        }

        // 显示对话框
        dialogAddURL.show();
    }


    /**
     * 删除笔记对话框和添加URL对话框的销毁方法
     */
    @Override
    protected void onDestroy() {
        super.onDestroy();

        // 如果存在删除笔记对话框，则弹出对话框并关闭它
        if(dialogDeleteNote != null){
            dialogDeleteNote.dismiss();
        }

        // 如果存在添加URL对话框，则弹出对话框并关闭它
        if(dialogAddURL != null){
            dialogAddURL.dismiss();
        }
    }

}